package com.cskaoyan.javase.oop1._8static._5exercise;

/**
 * @description: 小练习
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * 请说明程序的输出结果，并分析流程
 * 1,先找出main方法,按照main方法中代码执行顺序,分析程序
 * 2,不要忘记启动main方法会触发类加载
 * 3,类加载过程中会声明初始化静态成员变量
 * 4,永远把类加载的过程先于创建对象考虑
 *
 * 显式赋值和构造器的执行顺序?
 * 构造器永远在成员变量的赋值顺序的最后执行,设计原则就是这样的,为了保证构造器赋值的正确性
 *
 */
public class Demo {
    //引用数据类型的静态成员变量的显式赋值
    //和static int a = 3;这句话没有本质区别
    static Cat cat = new Cat();
    static {
        System.out.println("Demo类加载了");
    }
    Dog dog = new Dog(); //成员变量的显式赋值
    //Dog dog2;

    public static void main(String[] args) {
        //System.out.println("hello world!");
        //Demo d = new Demo();
    }

    public Demo() {
        //构造器
        System.out.println("demo");
    }
}

class Cat {
    static Dog dog = new Dog(); //static3 int a = 10;
    static {
        System.out.println("Cat类加载了");
    }
    public Cat() {
        System.out.println("cat");
    }
}

class Dog {
    static Demo d = new Demo();
    static {
        System.out.println("Dog类加载了");
    }
    public Dog() {
        System.out.println("dog");
    }
}